package srv

import (
	"arc_srv4/common"
	apiUtil "arc_srv4/face/__4_0"
	"arc_srv4/utils"
	"github.com/kataras/iris/v12"
)

var (
	RedisFaceInfo = "face_transId_info"
)

// 检测人脸,返回人脸坐标
func CheckFaceInfo(ctx iris.Context) {
	req := new(common.FaceInfoReq)
	if err := ctx.ReadJSON(&req); err != nil {
		// 参数错误
		_, _ = ctx.JSON(common.ApiNoDataResponse(common.Http10006, common.Http10006Desc))
	} else {
		if req.Faces == "" {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, "尚未读取到人脸图片信息"))
			return
		}

		transId := req.TransId
		if !common.AppConCfg.Repeat {
			tranIdRedis := string(utils.RedisGet(RedisFaceInfo))
			if tranIdRedis == transId {
				_, _ = ctx.JSON(common.ApiNoDataResponse(500, "该请求已经处理，无需重复请求"))
				return
			}
			utils.RedisSet(RedisFaceInfo, req.TransId, -1)
		}

		imageByte, message := apiUtil.ImageByte(req.Faces, transId)
		if imageByte == nil {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, message))
			return
		}

		ib, message := apiUtil.SaveImage(common.AppConCfg.Path.Check, "face_"+transId+".jpg", imageByte, transId)
		if !ib {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, message))
			return
		}

		if !apiUtil.ActivationClient(common.ArcCfg.AppId, common.ArcCfg.AppKey, common.ArcCfg.ActiveKey) {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, "激活失败"))
			return
		}

		var width, height int
		var imageData []uint8
		// 请求数据 正式打开
		if !common.AppConCfg.Test {
			width, height, imageData = apiUtil.ImageConvert(imageByte, transId)
		} else {
			// 文件数据 测试时打开
			width, height, imageData, imageByte = apiUtil.ImageConvertFromImage("./test.jpg")
		}

		ic, engine := apiUtil.InitEngineUtil(transId)
		if !ic {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, "初始化引擎失败"))
			return
		}

		ibr := apiUtil.SetLiveUtil(engine, transId, common.AppConCfg.Face.Thresholdmodel_BGR, common.AppConCfg.Face.Thresholdmodel_IR)
		if !ibr {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, "设置活体可信度失败"))
			return
		}

		icr := apiUtil.SetShelterUtil(engine, transId, common.AppConCfg.Face.Thresholdmodel_Mask)
		if !icr {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, "设置面部遮挡失败"))
			return
		}

		info := apiUtil.DectFaceUtil(engine, transId, width, height, imageData)
		if info == nil {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, "检测人脸失败"))
			return
		}

		if info.FaceNum == 0 {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, "未检测到人脸"))
			return
		}

		ibo, multi := apiUtil.GetFaceInfos(engine, transId, width, height, imageData, *info, imageByte, 0, 0)

		if !ibo {
			_, _ = ctx.JSON(common.ApiNoDataResponse(500, "获取人脸信息失败"))
			return
		}

		_, _ = ctx.JSON(common.ApiResponse(200, multi, "获取人脸信息成功"))
		// 销毁引擎
		apiUtil.ReleaseEngine(engine, transId)
		// 返回
		return
	}
}
